/*
 * Selling Partner API for Orders
 *
 * Use the Orders Selling Partner API to programmatically retrieve order information. With this API, you can develop fast, flexible, and custom applications to manage order synchronization, perform order research, and create demand-based decision support tools.   _Note:_ For the JP, AU, and SG marketplaces, the Orders API supports orders from 2016 onward. For all other marketplaces, the Orders API supports orders for the last two years (orders older than this don't show up in the response).
 *
 * The version of the OpenAPI document: v0
 * Generated by: https://github.com/openapitools/openapi-generator.git
 */


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.ComponentModel.DataAnnotations;
using OpenAPIDateConverter = software.amzn.spapi.Client.OpenAPIDateConverter;

namespace software.amzn.spapi.Model.orders.v0
{
    /// <summary>
    /// A single order item.
    /// </summary>
    [DataContract(Name = "OrderItem")]
    public partial class OrderItem : IValidatableObject
    {
        /// <summary>
        /// The category of deemed reseller. This applies to selling partners that are not based in the EU and is used to help them meet the VAT Deemed Reseller tax laws in the EU and UK.
        /// </summary>
        /// <value>The category of deemed reseller. This applies to selling partners that are not based in the EU and is used to help them meet the VAT Deemed Reseller tax laws in the EU and UK.</value>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum DeemedResellerCategoryEnum
        {
            /// <summary>
            /// Enum IOSS for value: IOSS
            /// </summary>
            [EnumMember(Value = "IOSS")]
            IOSS = 1,

            /// <summary>
            /// Enum UOSS for value: UOSS
            /// </summary>
            [EnumMember(Value = "UOSS")]
            UOSS = 2
        }


        /// <summary>
        /// The category of deemed reseller. This applies to selling partners that are not based in the EU and is used to help them meet the VAT Deemed Reseller tax laws in the EU and UK.
        /// </summary>
        /// <value>The category of deemed reseller. This applies to selling partners that are not based in the EU and is used to help them meet the VAT Deemed Reseller tax laws in the EU and UK.</value>
        [DataMember(Name = "DeemedResellerCategory", EmitDefaultValue = false)]
        public DeemedResellerCategoryEnum? DeemedResellerCategory { get; set; }
        /// <summary>
        /// Initializes a new instance of the <see cref="OrderItem" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected OrderItem() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="OrderItem" /> class.
        /// </summary>
        /// <param name="aSIN">The item&#39;s Amazon Standard Identification Number (ASIN). (required).</param>
        /// <param name="sellerSKU">The item&#39;s seller stock keeping unit (SKU)..</param>
        /// <param name="orderItemId">An Amazon-defined order item identifier. (required).</param>
        /// <param name="associatedItems">A list of associated items that a customer has purchased with a product. For example, a tire installation service purchased with tires..</param>
        /// <param name="title">The item&#39;s name..</param>
        /// <param name="quantityOrdered">The number of items in the order.  (required).</param>
        /// <param name="quantityShipped">The number of items shipped..</param>
        /// <param name="productInfo">productInfo.</param>
        /// <param name="pointsGranted">pointsGranted.</param>
        /// <param name="itemPrice">itemPrice.</param>
        /// <param name="shippingPrice">shippingPrice.</param>
        /// <param name="itemTax">itemTax.</param>
        /// <param name="shippingTax">shippingTax.</param>
        /// <param name="shippingDiscount">shippingDiscount.</param>
        /// <param name="shippingDiscountTax">shippingDiscountTax.</param>
        /// <param name="promotionDiscount">promotionDiscount.</param>
        /// <param name="promotionDiscountTax">promotionDiscountTax.</param>
        /// <param name="promotionIds">A list of promotion identifiers provided by the seller when the promotions were created..</param>
        /// <param name="cODFee">cODFee.</param>
        /// <param name="cODFeeDiscount">cODFeeDiscount.</param>
        /// <param name="isGift">Indicates whether the item is a gift.  **Possible values**: &#x60;true&#x60; and &#x60;false&#x60;..</param>
        /// <param name="conditionNote">The condition of the item, as described by the seller..</param>
        /// <param name="conditionId">The condition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Used&#x60;, &#x60;Collectible&#x60;, &#x60;Refurbished&#x60;, &#x60;Preorder&#x60;, and &#x60;Club&#x60;..</param>
        /// <param name="conditionSubtypeId">The subcondition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Mint&#x60;, &#x60;Very Good&#x60;, &#x60;Good&#x60;, &#x60;Acceptable&#x60;, &#x60;Poor&#x60;, &#x60;Club&#x60;, &#x60;OEM&#x60;, &#x60;Warranty&#x60;, &#x60;Refurbished Warranty&#x60;, &#x60;Refurbished&#x60;, &#x60;Open Box&#x60;, &#x60;Any&#x60;, and &#x60;Other&#x60;..</param>
        /// <param name="scheduledDeliveryStartDate">The start date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format..</param>
        /// <param name="scheduledDeliveryEndDate">The end date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format..</param>
        /// <param name="priceDesignation">Indicates that the selling price is a special price that is only available for Amazon Business orders. For more information about the Amazon Business Seller Program, refer to the [Amazon Business website](https://www.amazon.com/b2b/info/amazon-business).   **Possible values**: &#x60;BusinessPrice&#x60;.</param>
        /// <param name="taxCollection">taxCollection.</param>
        /// <param name="serialNumberRequired">When true, the product type for this item has a serial number.   Only returned for Amazon Easy Ship orders..</param>
        /// <param name="isTransparency">When true, the ASIN is enrolled in Transparency. The Transparency serial number that you must submit is determined by:  **1D or 2D Barcode:** This has a **T** logo. Submit either the 29-character alpha-numeric identifier beginning with **AZ** or **ZA**, or the 38-character Serialized Global Trade Item Number (SGTIN). **2D Barcode SN:** Submit the 7- to 20-character serial number barcode, which likely has the prefix **SN**. The serial number is applied to the same side of the packaging as the GTIN (UPC/EAN/ISBN) barcode. **QR code SN:** Submit the URL that the QR code generates..</param>
        /// <param name="iossNumber">The IOSS number of the marketplace. Sellers shipping to the EU from outside the EU must provide this IOSS number to their carrier when Amazon has collected the VAT on the sale..</param>
        /// <param name="storeChainStoreId">The store chain store identifier. Linked to a specific store in a store chain..</param>
        /// <param name="deemedResellerCategory">The category of deemed reseller. This applies to selling partners that are not based in the EU and is used to help them meet the VAT Deemed Reseller tax laws in the EU and UK..</param>
        /// <param name="buyerInfo">buyerInfo.</param>
        /// <param name="buyerRequestedCancel">buyerRequestedCancel.</param>
        /// <param name="serialNumbers">A list of serial numbers for electronic products that are shipped to customers. Returned for FBA orders only..</param>
        /// <param name="substitutionPreferences">substitutionPreferences.</param>
        /// <param name="measurement">measurement.</param>
        /// <param name="shippingConstraints">shippingConstraints.</param>
        /// <param name="amazonPrograms">amazonPrograms.</param>
        public OrderItem(string aSIN = default(string), string sellerSKU = default(string), string orderItemId = default(string), List<AssociatedItem> associatedItems = default(List<AssociatedItem>), string title = default(string), int quantityOrdered = default(int), int quantityShipped = default(int), ProductInfoDetail productInfo = default(ProductInfoDetail), PointsGrantedDetail pointsGranted = default(PointsGrantedDetail), Money itemPrice = default(Money), Money shippingPrice = default(Money), Money itemTax = default(Money), Money shippingTax = default(Money), Money shippingDiscount = default(Money), Money shippingDiscountTax = default(Money), Money promotionDiscount = default(Money), Money promotionDiscountTax = default(Money), List<string> promotionIds = default(List<string>), Money cODFee = default(Money), Money cODFeeDiscount = default(Money), string isGift = default(string), string conditionNote = default(string), string conditionId = default(string), string conditionSubtypeId = default(string), string scheduledDeliveryStartDate = default(string), string scheduledDeliveryEndDate = default(string), string priceDesignation = default(string), TaxCollection taxCollection = default(TaxCollection), bool serialNumberRequired = default(bool), bool isTransparency = default(bool), string iossNumber = default(string), string storeChainStoreId = default(string), DeemedResellerCategoryEnum? deemedResellerCategory = default(DeemedResellerCategoryEnum?), ItemBuyerInfo buyerInfo = default(ItemBuyerInfo), BuyerRequestedCancel buyerRequestedCancel = default(BuyerRequestedCancel), List<string> serialNumbers = default(List<string>), SubstitutionPreferences substitutionPreferences = default(SubstitutionPreferences), Measurement measurement = default(Measurement), ShippingConstraints shippingConstraints = default(ShippingConstraints), AmazonPrograms amazonPrograms = default(AmazonPrograms))
        {
            // to ensure "aSIN" is required (not null)
            if (aSIN == null)
            {
                throw new ArgumentNullException("aSIN is a required property for OrderItem and cannot be null");
            }
            this.ASIN = aSIN;
            // to ensure "orderItemId" is required (not null)
            if (orderItemId == null)
            {
                throw new ArgumentNullException("orderItemId is a required property for OrderItem and cannot be null");
            }
            this.OrderItemId = orderItemId;
            this.QuantityOrdered = quantityOrdered;
            this.SellerSKU = sellerSKU;
            this.AssociatedItems = associatedItems;
            this.Title = title;
            this.QuantityShipped = quantityShipped;
            this.ProductInfo = productInfo;
            this.PointsGranted = pointsGranted;
            this.ItemPrice = itemPrice;
            this.ShippingPrice = shippingPrice;
            this.ItemTax = itemTax;
            this.ShippingTax = shippingTax;
            this.ShippingDiscount = shippingDiscount;
            this.ShippingDiscountTax = shippingDiscountTax;
            this.PromotionDiscount = promotionDiscount;
            this.PromotionDiscountTax = promotionDiscountTax;
            this.PromotionIds = promotionIds;
            this.CODFee = cODFee;
            this.CODFeeDiscount = cODFeeDiscount;
            this.IsGift = isGift;
            this.ConditionNote = conditionNote;
            this.ConditionId = conditionId;
            this.ConditionSubtypeId = conditionSubtypeId;
            this.ScheduledDeliveryStartDate = scheduledDeliveryStartDate;
            this.ScheduledDeliveryEndDate = scheduledDeliveryEndDate;
            this.PriceDesignation = priceDesignation;
            this.TaxCollection = taxCollection;
            this.SerialNumberRequired = serialNumberRequired;
            this.IsTransparency = isTransparency;
            this.IossNumber = iossNumber;
            this.StoreChainStoreId = storeChainStoreId;
            this.DeemedResellerCategory = deemedResellerCategory;
            this.BuyerInfo = buyerInfo;
            this.BuyerRequestedCancel = buyerRequestedCancel;
            this.SerialNumbers = serialNumbers;
            this.SubstitutionPreferences = substitutionPreferences;
            this.Measurement = measurement;
            this.ShippingConstraints = shippingConstraints;
            this.AmazonPrograms = amazonPrograms;
        }

        /// <summary>
        /// The item&#39;s Amazon Standard Identification Number (ASIN).
        /// </summary>
        /// <value>The item&#39;s Amazon Standard Identification Number (ASIN).</value>
        [DataMember(Name = "ASIN", IsRequired = true, EmitDefaultValue = true)]
        public string ASIN { get; set; }

        /// <summary>
        /// The item&#39;s seller stock keeping unit (SKU).
        /// </summary>
        /// <value>The item&#39;s seller stock keeping unit (SKU).</value>
        [DataMember(Name = "SellerSKU", EmitDefaultValue = false)]
        public string SellerSKU { get; set; }

        /// <summary>
        /// An Amazon-defined order item identifier.
        /// </summary>
        /// <value>An Amazon-defined order item identifier.</value>
        [DataMember(Name = "OrderItemId", IsRequired = true, EmitDefaultValue = true)]
        public string OrderItemId { get; set; }

        /// <summary>
        /// A list of associated items that a customer has purchased with a product. For example, a tire installation service purchased with tires.
        /// </summary>
        /// <value>A list of associated items that a customer has purchased with a product. For example, a tire installation service purchased with tires.</value>
        [DataMember(Name = "AssociatedItems", EmitDefaultValue = false)]
        public List<AssociatedItem> AssociatedItems { get; set; }

        /// <summary>
        /// The item&#39;s name.
        /// </summary>
        /// <value>The item&#39;s name.</value>
        [DataMember(Name = "Title", EmitDefaultValue = false)]
        public string Title { get; set; }

        /// <summary>
        /// The number of items in the order. 
        /// </summary>
        /// <value>The number of items in the order. </value>
        [DataMember(Name = "QuantityOrdered", IsRequired = true, EmitDefaultValue = true)]
        public int QuantityOrdered { get; set; }

        /// <summary>
        /// The number of items shipped.
        /// </summary>
        /// <value>The number of items shipped.</value>
        [DataMember(Name = "QuantityShipped", EmitDefaultValue = false)]
        public int QuantityShipped { get; set; }

        /// <summary>
        /// Gets or Sets ProductInfo
        /// </summary>
        [DataMember(Name = "ProductInfo", EmitDefaultValue = false)]
        public ProductInfoDetail ProductInfo { get; set; }

        /// <summary>
        /// Gets or Sets PointsGranted
        /// </summary>
        [DataMember(Name = "PointsGranted", EmitDefaultValue = false)]
        public PointsGrantedDetail PointsGranted { get; set; }

        /// <summary>
        /// Gets or Sets ItemPrice
        /// </summary>
        [DataMember(Name = "ItemPrice", EmitDefaultValue = false)]
        public Money ItemPrice { get; set; }

        /// <summary>
        /// Gets or Sets ShippingPrice
        /// </summary>
        [DataMember(Name = "ShippingPrice", EmitDefaultValue = false)]
        public Money ShippingPrice { get; set; }

        /// <summary>
        /// Gets or Sets ItemTax
        /// </summary>
        [DataMember(Name = "ItemTax", EmitDefaultValue = false)]
        public Money ItemTax { get; set; }

        /// <summary>
        /// Gets or Sets ShippingTax
        /// </summary>
        [DataMember(Name = "ShippingTax", EmitDefaultValue = false)]
        public Money ShippingTax { get; set; }

        /// <summary>
        /// Gets or Sets ShippingDiscount
        /// </summary>
        [DataMember(Name = "ShippingDiscount", EmitDefaultValue = false)]
        public Money ShippingDiscount { get; set; }

        /// <summary>
        /// Gets or Sets ShippingDiscountTax
        /// </summary>
        [DataMember(Name = "ShippingDiscountTax", EmitDefaultValue = false)]
        public Money ShippingDiscountTax { get; set; }

        /// <summary>
        /// Gets or Sets PromotionDiscount
        /// </summary>
        [DataMember(Name = "PromotionDiscount", EmitDefaultValue = false)]
        public Money PromotionDiscount { get; set; }

        /// <summary>
        /// Gets or Sets PromotionDiscountTax
        /// </summary>
        [DataMember(Name = "PromotionDiscountTax", EmitDefaultValue = false)]
        public Money PromotionDiscountTax { get; set; }

        /// <summary>
        /// A list of promotion identifiers provided by the seller when the promotions were created.
        /// </summary>
        /// <value>A list of promotion identifiers provided by the seller when the promotions were created.</value>
        [DataMember(Name = "PromotionIds", EmitDefaultValue = false)]
        public List<string> PromotionIds { get; set; }

        /// <summary>
        /// Gets or Sets CODFee
        /// </summary>
        [DataMember(Name = "CODFee", EmitDefaultValue = false)]
        public Money CODFee { get; set; }

        /// <summary>
        /// Gets or Sets CODFeeDiscount
        /// </summary>
        [DataMember(Name = "CODFeeDiscount", EmitDefaultValue = false)]
        public Money CODFeeDiscount { get; set; }

        /// <summary>
        /// Indicates whether the item is a gift.  **Possible values**: &#x60;true&#x60; and &#x60;false&#x60;.
        /// </summary>
        /// <value>Indicates whether the item is a gift.  **Possible values**: &#x60;true&#x60; and &#x60;false&#x60;.</value>
        [DataMember(Name = "IsGift", EmitDefaultValue = false)]
        public string IsGift { get; set; }

        /// <summary>
        /// The condition of the item, as described by the seller.
        /// </summary>
        /// <value>The condition of the item, as described by the seller.</value>
        [DataMember(Name = "ConditionNote", EmitDefaultValue = false)]
        public string ConditionNote { get; set; }

        /// <summary>
        /// The condition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Used&#x60;, &#x60;Collectible&#x60;, &#x60;Refurbished&#x60;, &#x60;Preorder&#x60;, and &#x60;Club&#x60;.
        /// </summary>
        /// <value>The condition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Used&#x60;, &#x60;Collectible&#x60;, &#x60;Refurbished&#x60;, &#x60;Preorder&#x60;, and &#x60;Club&#x60;.</value>
        [DataMember(Name = "ConditionId", EmitDefaultValue = false)]
        public string ConditionId { get; set; }

        /// <summary>
        /// The subcondition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Mint&#x60;, &#x60;Very Good&#x60;, &#x60;Good&#x60;, &#x60;Acceptable&#x60;, &#x60;Poor&#x60;, &#x60;Club&#x60;, &#x60;OEM&#x60;, &#x60;Warranty&#x60;, &#x60;Refurbished Warranty&#x60;, &#x60;Refurbished&#x60;, &#x60;Open Box&#x60;, &#x60;Any&#x60;, and &#x60;Other&#x60;.
        /// </summary>
        /// <value>The subcondition of the item.  **Possible values**: &#x60;New&#x60;, &#x60;Mint&#x60;, &#x60;Very Good&#x60;, &#x60;Good&#x60;, &#x60;Acceptable&#x60;, &#x60;Poor&#x60;, &#x60;Club&#x60;, &#x60;OEM&#x60;, &#x60;Warranty&#x60;, &#x60;Refurbished Warranty&#x60;, &#x60;Refurbished&#x60;, &#x60;Open Box&#x60;, &#x60;Any&#x60;, and &#x60;Other&#x60;.</value>
        [DataMember(Name = "ConditionSubtypeId", EmitDefaultValue = false)]
        public string ConditionSubtypeId { get; set; }

        /// <summary>
        /// The start date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format.
        /// </summary>
        /// <value>The start date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format.</value>
        [DataMember(Name = "ScheduledDeliveryStartDate", EmitDefaultValue = false)]
        public string ScheduledDeliveryStartDate { get; set; }

        /// <summary>
        /// The end date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format.
        /// </summary>
        /// <value>The end date of the scheduled delivery window in the time zone for the order destination. In [ISO 8601](https://developer-docs.amazon.com/sp-api/docs/iso-8601) date time format.</value>
        [DataMember(Name = "ScheduledDeliveryEndDate", EmitDefaultValue = false)]
        public string ScheduledDeliveryEndDate { get; set; }

        /// <summary>
        /// Indicates that the selling price is a special price that is only available for Amazon Business orders. For more information about the Amazon Business Seller Program, refer to the [Amazon Business website](https://www.amazon.com/b2b/info/amazon-business).   **Possible values**: &#x60;BusinessPrice&#x60;
        /// </summary>
        /// <value>Indicates that the selling price is a special price that is only available for Amazon Business orders. For more information about the Amazon Business Seller Program, refer to the [Amazon Business website](https://www.amazon.com/b2b/info/amazon-business).   **Possible values**: &#x60;BusinessPrice&#x60;</value>
        [DataMember(Name = "PriceDesignation", EmitDefaultValue = false)]
        public string PriceDesignation { get; set; }

        /// <summary>
        /// Gets or Sets TaxCollection
        /// </summary>
        [DataMember(Name = "TaxCollection", EmitDefaultValue = false)]
        public TaxCollection TaxCollection { get; set; }

        /// <summary>
        /// When true, the product type for this item has a serial number.   Only returned for Amazon Easy Ship orders.
        /// </summary>
        /// <value>When true, the product type for this item has a serial number.   Only returned for Amazon Easy Ship orders.</value>
        [DataMember(Name = "SerialNumberRequired", EmitDefaultValue = true)]
        public bool SerialNumberRequired { get; set; }

        /// <summary>
        /// When true, the ASIN is enrolled in Transparency. The Transparency serial number that you must submit is determined by:  **1D or 2D Barcode:** This has a **T** logo. Submit either the 29-character alpha-numeric identifier beginning with **AZ** or **ZA**, or the 38-character Serialized Global Trade Item Number (SGTIN). **2D Barcode SN:** Submit the 7- to 20-character serial number barcode, which likely has the prefix **SN**. The serial number is applied to the same side of the packaging as the GTIN (UPC/EAN/ISBN) barcode. **QR code SN:** Submit the URL that the QR code generates.
        /// </summary>
        /// <value>When true, the ASIN is enrolled in Transparency. The Transparency serial number that you must submit is determined by:  **1D or 2D Barcode:** This has a **T** logo. Submit either the 29-character alpha-numeric identifier beginning with **AZ** or **ZA**, or the 38-character Serialized Global Trade Item Number (SGTIN). **2D Barcode SN:** Submit the 7- to 20-character serial number barcode, which likely has the prefix **SN**. The serial number is applied to the same side of the packaging as the GTIN (UPC/EAN/ISBN) barcode. **QR code SN:** Submit the URL that the QR code generates.</value>
        [DataMember(Name = "IsTransparency", EmitDefaultValue = true)]
        public bool IsTransparency { get; set; }

        /// <summary>
        /// The IOSS number of the marketplace. Sellers shipping to the EU from outside the EU must provide this IOSS number to their carrier when Amazon has collected the VAT on the sale.
        /// </summary>
        /// <value>The IOSS number of the marketplace. Sellers shipping to the EU from outside the EU must provide this IOSS number to their carrier when Amazon has collected the VAT on the sale.</value>
        [DataMember(Name = "IossNumber", EmitDefaultValue = false)]
        public string IossNumber { get; set; }

        /// <summary>
        /// The store chain store identifier. Linked to a specific store in a store chain.
        /// </summary>
        /// <value>The store chain store identifier. Linked to a specific store in a store chain.</value>
        [DataMember(Name = "StoreChainStoreId", EmitDefaultValue = false)]
        public string StoreChainStoreId { get; set; }

        /// <summary>
        /// Gets or Sets BuyerInfo
        /// </summary>
        [DataMember(Name = "BuyerInfo", EmitDefaultValue = false)]
        public ItemBuyerInfo BuyerInfo { get; set; }

        /// <summary>
        /// Gets or Sets BuyerRequestedCancel
        /// </summary>
        [DataMember(Name = "BuyerRequestedCancel", EmitDefaultValue = false)]
        public BuyerRequestedCancel BuyerRequestedCancel { get; set; }

        /// <summary>
        /// A list of serial numbers for electronic products that are shipped to customers. Returned for FBA orders only.
        /// </summary>
        /// <value>A list of serial numbers for electronic products that are shipped to customers. Returned for FBA orders only.</value>
        [DataMember(Name = "SerialNumbers", EmitDefaultValue = false)]
        public List<string> SerialNumbers { get; set; }

        /// <summary>
        /// Gets or Sets SubstitutionPreferences
        /// </summary>
        [DataMember(Name = "SubstitutionPreferences", EmitDefaultValue = false)]
        public SubstitutionPreferences SubstitutionPreferences { get; set; }

        /// <summary>
        /// Gets or Sets Measurement
        /// </summary>
        [DataMember(Name = "Measurement", EmitDefaultValue = false)]
        public Measurement Measurement { get; set; }

        /// <summary>
        /// Gets or Sets ShippingConstraints
        /// </summary>
        [DataMember(Name = "ShippingConstraints", EmitDefaultValue = false)]
        public ShippingConstraints ShippingConstraints { get; set; }

        /// <summary>
        /// Gets or Sets AmazonPrograms
        /// </summary>
        [DataMember(Name = "AmazonPrograms", EmitDefaultValue = false)]
        public AmazonPrograms AmazonPrograms { get; set; }

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("class OrderItem {\n");
            sb.Append("  ASIN: ").Append(ASIN).Append("\n");
            sb.Append("  SellerSKU: ").Append(SellerSKU).Append("\n");
            sb.Append("  OrderItemId: ").Append(OrderItemId).Append("\n");
            sb.Append("  AssociatedItems: ").Append(AssociatedItems).Append("\n");
            sb.Append("  Title: ").Append(Title).Append("\n");
            sb.Append("  QuantityOrdered: ").Append(QuantityOrdered).Append("\n");
            sb.Append("  QuantityShipped: ").Append(QuantityShipped).Append("\n");
            sb.Append("  ProductInfo: ").Append(ProductInfo).Append("\n");
            sb.Append("  PointsGranted: ").Append(PointsGranted).Append("\n");
            sb.Append("  ItemPrice: ").Append(ItemPrice).Append("\n");
            sb.Append("  ShippingPrice: ").Append(ShippingPrice).Append("\n");
            sb.Append("  ItemTax: ").Append(ItemTax).Append("\n");
            sb.Append("  ShippingTax: ").Append(ShippingTax).Append("\n");
            sb.Append("  ShippingDiscount: ").Append(ShippingDiscount).Append("\n");
            sb.Append("  ShippingDiscountTax: ").Append(ShippingDiscountTax).Append("\n");
            sb.Append("  PromotionDiscount: ").Append(PromotionDiscount).Append("\n");
            sb.Append("  PromotionDiscountTax: ").Append(PromotionDiscountTax).Append("\n");
            sb.Append("  PromotionIds: ").Append(PromotionIds).Append("\n");
            sb.Append("  CODFee: ").Append(CODFee).Append("\n");
            sb.Append("  CODFeeDiscount: ").Append(CODFeeDiscount).Append("\n");
            sb.Append("  IsGift: ").Append(IsGift).Append("\n");
            sb.Append("  ConditionNote: ").Append(ConditionNote).Append("\n");
            sb.Append("  ConditionId: ").Append(ConditionId).Append("\n");
            sb.Append("  ConditionSubtypeId: ").Append(ConditionSubtypeId).Append("\n");
            sb.Append("  ScheduledDeliveryStartDate: ").Append(ScheduledDeliveryStartDate).Append("\n");
            sb.Append("  ScheduledDeliveryEndDate: ").Append(ScheduledDeliveryEndDate).Append("\n");
            sb.Append("  PriceDesignation: ").Append(PriceDesignation).Append("\n");
            sb.Append("  TaxCollection: ").Append(TaxCollection).Append("\n");
            sb.Append("  SerialNumberRequired: ").Append(SerialNumberRequired).Append("\n");
            sb.Append("  IsTransparency: ").Append(IsTransparency).Append("\n");
            sb.Append("  IossNumber: ").Append(IossNumber).Append("\n");
            sb.Append("  StoreChainStoreId: ").Append(StoreChainStoreId).Append("\n");
            sb.Append("  DeemedResellerCategory: ").Append(DeemedResellerCategory).Append("\n");
            sb.Append("  BuyerInfo: ").Append(BuyerInfo).Append("\n");
            sb.Append("  BuyerRequestedCancel: ").Append(BuyerRequestedCancel).Append("\n");
            sb.Append("  SerialNumbers: ").Append(SerialNumbers).Append("\n");
            sb.Append("  SubstitutionPreferences: ").Append(SubstitutionPreferences).Append("\n");
            sb.Append("  Measurement: ").Append(Measurement).Append("\n");
            sb.Append("  ShippingConstraints: ").Append(ShippingConstraints).Append("\n");
            sb.Append("  AmazonPrograms: ").Append(AmazonPrograms).Append("\n");
            sb.Append("}\n");
            return sb.ToString();
        }

        /// <summary>
        /// Returns the JSON string presentation of the object
        /// </summary>
        /// <returns>JSON string presentation of the object</returns>
        public virtual string ToJson()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
        }

        /// <summary>
        /// To validate all properties of the instance
        /// </summary>
        /// <param name="validationContext">Validation context</param>
        /// <returns>Validation Result</returns>
        IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }

}
